#include <sstream>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string.h>

#include "../common/ArchivoIni.h"
#include "../common/Argv.h"
#include "../channel_common/ChannelCommon.h"
#include "../common/StringUtils.h"
#include "../logger/logger.h"
#include "../IPC/MessageQueue.h"
#include "../middleware/MiddlewareCommon.h"
#include "../middleware/CommunicationVendedor.h"
#include "../IPC/ClientSocket.h"

void launchChannel(std::string channelName)
{
//	Argv args;
//	std::string server;
//	int puertoSalida = 0;
//	int agentId;
//
//	//Obtengo la configuracion
//	MapaIni config = ArchivoIni::parsearComoIni("config.ini");
//
//	server = config["server_vend"];
//	puertoSalida = StringUtils::StringToNumber<int>(config["puerto_salida_vend"]);
//
//	CLogger::log("Creador Canales Clientes:Me conecto a:"+server+":"+
//				  StringUtils::NumberToString(puertoSalida),
//				  LogLevelEnum::INFO);
//
//	//Construccion IPCs
//	ipc::ClientSocket socketEntrada;
//	socketEntrada.connect(server, puertoSalida);
//
//	//Pido un identificador
//	char buffer[TAM_BUFFER];
//	channel::StartComunicationMessage startMsg1;
//	channel::StartComunicationMessage startMsg2;
//
//	//Leo el id de channel
//	MapaIni agentMTypes = ArchivoIni::parsearComoIni(channel::nameToMtypeFilepathAgente);
//
//	MapaIni::iterator it = agentMTypes.find(channelName);
//
//	 if(strcpy(startMsg1.channelName,channelName.c_str())<0)
//		 throw Exception("Error while copying the channel Name");
//
//	//Si no hay un id mando 0, para pedir un id nuevo
//	if(it==agentMTypes.end())
//		startMsg1.agentId = 0;
//	else
//		startMsg1.agentId = StringUtils::StringToNumber<int>(it->second);
//
//	CLogger::log("Se pide un id de agente:"+StringUtils::NumberToString(startMsg1.agentId),
//								LogLevelEnum::INFO);
//
//
//	memcpy(buffer, &startMsg1, sizeof(channel::StartComunicationMessage));
//	socketEntrada.send(buffer, TAM_BUFFER);
//
//	//Obtengo un identificador
//	socketEntrada.receive(buffer, TAM_BUFFER);
//	memcpy(&startMsg2, &buffer, sizeof(channel::StartComunicationMessage));
//
//	CLogger::log("Se obtiene un id de agente:"+StringUtils::NumberToString(startMsg2.agentId),
//									LogLevelEnum::INFO);
//
//
//	//Si obtuve un id guardo el id en un archivo
//	if(startMsg1.agentId == 0)
//	{
//		agentMTypes[channelName] = StringUtils::NumberToString(startMsg2.agentId);
//		ArchivoIni::guardarComoIni(channel::nameToMtypeFilepathAgente,agentMTypes);
//	}
//
//	//Creo los argumentos
//	args.pushArg("");
//	args.pushArg(channelName);
//
//	pid_t pid = fork();
//	if (pid == 0)
//	{
//		//Cierro el socket de entrada (el que recibe del broker)
//		socketEntrada.close();
//
//		execvp("./out/channel_out_agente", args.getArgv());
//		throw("Execlp ./channel_out_agente error");
//	}
//
//	pid_t pid2 = fork();
//	if (pid2 == 0)
//	{
//		args.pushArg(StringUtils::NumberToString(socketEntrada.getFd()));
//
//		execvp("./out/channel_in_agente", args.getArgv());
//		throw("Execlp ./channel_in_agente error");
//	}
//
//	socketEntrada.close();
}
